package com.laity.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * @author: Laity
 * @Project: JavaLaity
 * @Package: com.laity.callable.CallableTest
 * @Date: 2023年11月26日 03:13
 * @Description: Callable使用
 */

public class CallableTest {
    public static void main(String[] args) {
        /*
        内部类实现Callable接口
        new Thread(new Runnable() {}).start();
        new Thread(new FutureTask<V>() {}).start();
        new Thread(new FutureTask<V>( Callable<V> ) {}).start();

        实现原理就是：futureTask传入callable对象，在run方法中调用callable的call方法，将结果返回给futureTask
         */
        try {
            Callable1 callable1 = new Callable1();
            FutureTask<Integer> futureTask = new FutureTask<>(callable1);
            new Thread(futureTask, "Callable1").start();
            new Thread(futureTask, "Callable2").start();  // 结果会被缓存，所以第二个线程会直接返回结果，提高效率
            /*
            1、这个get方法会阻塞，直到callable执行完成！所以把它放在最后，防止阻塞
            2、使用futureTask.isDone()判断是否执行完成
            3、或者使用异步通信来处理！
             */
            Integer integer = futureTask.get();
            System.out.println(integer);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


/**
 * @author Laity
 */
class Callable1 implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        System.out.println("Callable1" + "==>" + Thread.currentThread().getName());
        return 1 << 4;
    }
}


